非 Control Tower 環境で 許可された AMI の declarative policies(宣言型ポリシー)の適用をやってみた
カスタマーサクセス部 運用支援チームのいたくらです。
はじめに
先月、Amazon EC2 で AMI ガバナンスを強化するために 許可された AMI が導入されたというアップデートブログを公開しました。
その際は特定アカウント上でのみ、許可された AMI の設定を有効にしていました。
今回は、宣言型ポリシーを使用して、Organizations 内の一部 OU で許可された AMI の設定を有効にしてみました。
検証環境について
参考として、検証環境について補足します。
- AWS Organizations を有効化済みで、以下の OU 構成
- SandboxOU 配下には itkr_mem02(以降、アカウントA と表記)と itkr_mem03(以降、アカウントB と表記)が存在
- AWS Control Tower は有効化していない
- アカウントA、アカウントB それぞれで自己所有 AMI を作成済みで、それぞれ組織での共有を設定済み
やってみた
以下の公式ブログと公式ドキュメントを参考に実施しました。
- 公式ブログ
https://aws.amazon.com/jp/blogs/aws/simplify-governance-with-declarative-policies/ - 公式ドキュメント
https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_declarative.html
宣言型ポリシーを有効化する
ポリシーを作成して組織にアタッチする前にまずはポリシータイプを有効にする必要があります。
AWS Organizations のサービスページに移動し、「ポリシー」>「EC2 の宣言型ポリシー」の順にクリックします。
「EC2 の宣言型ポリシーを有効にする」をクリックします。
有効になったら以下のような表示が出ます。
宣言型ポリシーのアカウントステータスレポートを生成する
宣言型ポリシーを作成する前に宣言型ポリシーの機能「アカウントステータスレポート」を使用して、AWS 環境の現在のステータスを把握します。
まずアカウントステータスレポートを出力する S3 バケットを us-east-1(バージニア北部)で作成します。
Amazon S3 のサービスページに移動して、S3 バケットを作成し、作成したバケットに以下のバケットポリシーをアタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DeclarativePoliciesReportBucket",
"Effect": "Allow",
"Principal": {
"Service": [
"report.declarative-policies-ec2.amazonaws.com"
]
},
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::<bucketName>/*",
"Condition": {
"StringEquals": {
"aws:SourceArn": "arn:<partition>:declarative-policies-ec2:<region>:<accountId>:*"
}
}
}
]
}
S3 バケットの準備は以上です。続けてアカウントステータスレポートの生成に移ります。
AWS Organizations のサービスページより、「ポリシー」>「EC2 の宣言型ポリシー」>「アクション」>「アカウントステータスレポートを表示」>「ステータスレポートを生成」の順にクリックします。
先ほど作成した S3 バケットと、レポート範囲に含めるアカウントまたは OU を指定して、「送信」をクリックします。
今回は SandboxOU に宣言型ポリシーを適用する想定なので、SandboxOU を指定しています。
アカウントステータスレポートの生成には時間がかかるので、少し待ちます(以下は待機画面です)。
レポート生成が終わると、以下のような表示になります。
アカウント毎の詳細なレポートを確認したい場合は、S3 バケットからダウンロードすれば確認可能です。
今回は全項目で「アカウント全体で統一」が「Yes」という評価になっていましたが、統一できていない場合は「No」と評価されるため、「No」と評価された項目に紐づいた宣言型ポリシーを作成することで、必要なポリシーを効率良く適用できるようになっていそうだなと感じました。
宣言型ポリシーを作成する
実際に宣言型ポリシーを作成します。
今回は許可された AMI の宣言型ポリシーを作成します。
AWS Organizations のサービスページより、「ポリシー」>「EC2 の宣言型ポリシー」>「ポリシーを作成」の順にクリックします。
ポリシー名、ポリシーの説明、サービス属性を入力/選択します。
「許可されている画像設定」を選択すると、無効 / 有効 / 監査モード
のいずれかを選べるようになるので、今回は「監査モード」を選択しました。
また、AMI 基準については、AWS によって作成された AMI / AWS Marketplace で検証済みのプロバイダーによって作成された AMI / アカウントA で作成されたAMI
は許可するという設定にしました。
試しにカスタムエラーメッセージを設定して、最後に「ポリシーを作成」をクリックします。
※日本語で設定したらエラーが出たので、英語で設定しましょう
作成が完了すると利用可能なポリシー一覧に表示されます。
宣言型ポリシーをアタッチする
作成した宣言型ポリシーを SandboxOU にアタッチします。
正常にアタッチされると「ターゲット」タブにアタッチした SandboxOU が表示されました。
宣言型ポリシーが反映されたことを確認する
宣言型ポリシーを SandboxOU にアタッチできたので、反映されたことを確認します。
SandboxOU 配下にある アカウント A で AMI を確認します。
アカウント B で作成された AMI (AMI 名:test-ami-20250106-actB)は「Allowed image」列が「いいえ」となっています。
宣言型ポリシーでAWS によって作成された AMI / AWS Marketplace で検証済みのプロバイダーによって作成された AMI / アカウントA で作成されたAMI
は許可するという設定にしたので、反映されていますね。
管理アカウント上で許可された AMI 設定を「監査モード」から「有効」へ変更して、再びアカウント A で AMI を確認してみました。
基準を満たしていない(アカウント B が作成した)AMI については一覧に表示されなくなり、変更が反映されたことが確認できました。
また、宣言型ポリシーをアタッチした SandboxOU の詳細画面でも、許可された AMI の宣言型ポリシーが反映されていることが確認できました。
少しハマったこと
当初、アカウントステータスレポート出力用の S3 バケットを「東京リージョン」で作成していました。
ですが、アカウントステータスレポートの生成で「送信」をクリックしたら、以下のエラーが出ました。
「account-status-report-bucket-xxxxxxxxxxxx バケットに書き込めません。バケットが存在し、正しいリージョンにあり、呼び出し元のアカウントによって所有されており、バケットポリシーが正しいことを確認してください。」という内容でした。
バケット設定を見直したところ問題なさそうだったので、正しいリージョンって何だ?と思い公式ドキュメントを見直したところ「リクエストが行われたリージョンと同じリージョンに存在し、適切な S3 バケットポリシーを持っている必要がある」という記載がありました。
Organizations はグローバルサービスだから、リクエストが行われているリージョンはバージニア北部ってことか!と後から気付き、バージニア北部リージョンでバケットを作成し直して、再度アカウントステータスレポートの生成を試みたら成功しました。
ついつい東京リージョンで作ってしまうので、気を付けないといけないなと思いました。
さいごに
宣言型ポリシーは API レベルではなくサービスレベルで直接適用されるため、導入後の管理コストが抑えられるというメリットがあります。
使えるものは積極的に使っていきたいなと思いました。
また、カスタムエラーメッセージを確認してみたいと思ったのですが、下記の理由で確認できませんでした。
- 監査モードの場合、非準拠 AMI でもインスタンス起動可能なため、エラーメッセージは確認できない
- 有効の場合、そもそも AMI 一覧に表示されなくなるため起動不可能
- AWS CLI でインスタンス起動を試みてみたが、
An error occurred (InvalidAMIID.NotFound) when calling the RunInstances operation: The image id '[ami-041603a16xxxxxxxx]' does not exist
というエラーメッセージになってしまい、カスタムエラーメッセージを確認できない
- AWS CLI でインスタンス起動を試みてみたが、
他の宣言型ポリシーだとカスタムエラーメッセージを表示する場がありますが、許可された AMI の宣言型ポリシーのカスタムエラーメッセージについては、表示する場が無いのかも…?と思いました。
この記事がどなたかのお役に立てれば幸いです。
アノテーション株式会社について
アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。
サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。